11
תגובות
זה כנראה משהו טיפשי שלא שמתי לב/אני לא יודע אבל אני לא מצליח להבין מה, יש לי את הקוד הזה:
<?php
  $mysqli = new mysqli('yncoinfo.ipagemysql.com', 'socialn', '1234', 'socialn');
    class users {
      public function get_id() {
      $id = $_COOKIE['login-id'];
      $compile = explode('-',$id);
      $return = $compile[0];
      return $return;
    }
    public function get_info($id) {
      $query = $mysqli->query("SELECT * FROM users WHERE id='$id'");
      $return = $query->fetch_array();
      return $return;
    }
    public function set_cookie($username) {
      $return = 0;
      $query = $mysqli->query("SELECT id FROM users WHERE username='$username'");
      $oid = $query->fetch_array();
      if(empty($oid)) {
        $return = 1;
      }
      $id = $oid['id'];
      if(isset($_COOKIE['login-id']) && $return == 0) {
        $return = 2;
      }
      else {
        if($return == 0) {
          setcookie('login-id', $username.'-'.hash('sha256', $username.$id),time()+60*60*24*30*12*10);
          $return == 3;
        }
      }
      return $return;
    }
  }
  $users = new users();
  echo $users->set_cookie('admin');

ואני לא מצליח להבין מה לא נכון, האם בכלל עשיתי את זה כמו שצריך?

11 תשובות

avatar ענה zacharya ב 28 לאפריל 2014 #

לא קראתי את כל הקוד, אבל הגעתי לשורה השלישית ולא הבנתי משהו:

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
  }

אתה יצרת מופע של המחלקה mysqli ולא משתמש בה כאן?

avatar ענה yotamN ב 28 לאפריל 2014 #

@zacharya את הקוד הזה ספציפית העתקתי מאיפה שהוא שניסיתי למצוא פתרון ולא הצלחתי, זאת שורה לא חשובה ואני ימחק אותה

avatar ענה zacharya ב 28 לאפריל 2014 #

אתה יכול לשים פשוט:

if ($mysqli->connect_error)
   exit("Connect failed: \n". mysqli->connect_error);

עכשיו אני די בטוח שהבעיה היא פשוט שאתה יוצר את המחלקה mysqli מחוץ למחלקה users ככה כשאתה יוצר מופע של המחלקה ומפעיל את המתודה set_cookie אין לה שמץ מזה המשתנה הזה $mysqli, פשוט תעביר את המשתנה $mysqli ביצירה של המופע ובעזרת הconstruct תכניס אותו למאפיין של המחלקה.

avatar ענה yotamN ב 28 לאפריל 2014 #

@zacharya ניסיתי את זה, זה הגיע עכשיו כאשר היה קיים לי cookie ל-2 במשתנה return (כלומר הוא מצליח להגיע) אבל כאשר מחקתי את העוגיה וניסיתי שהוא יעשה set מחדש זה לא עבד

avatar ענה zacharya ב 28 לאפריל 2014 #

לא הצלחתי להבין את הבעיה.

avatar ענה intval ב 28 לאפריל 2014 #

למחלקה users אין בכלל גישה למשתנה mysqli
אם העתקת את הקוד מהאתר - שלח לי קישור. הגיע הזמן למחוק את זה, אחרת עוד מישהו יעתיק את זה.

avatar ענה yotamN ב 28 לאפריל 2014 #

@zacharya טעות שלי, הצלחתי על המשתנים גלובלים, תודה רבה :)

avatar ענה zacharya ב 28 לאפריל 2014 #

תקרא את התשובה הזאת.

avatar ענה yotamN ב 28 לאפריל 2014 #

@zacharya , @intval
עכשיו הקוד בסדר?

<?php
  class users {
    public function get_id() {
      $id = $_COOKIE['login-id'];
      $compile = explode('-',$id);
      $return = $compile[0];
      return $return;
    }
    public function get_info($id) {
      $query = this->mysqli->query("SELECT * FROM users WHERE id='$id'");
      $return = $query->fetch_array();
      return $return;
    }
    public function set_cookie($username) {
      $return = 0;
      $query = this->mysqli->query("SELECT id FROM users WHERE username='$username'");
      $oid = $query->fetch_array();
      if(empty($oid)) {
        $return = 1;
      }
      $id = $oid['id'];
      if(empty($id)) {
        $return = 1;
      }
      if(isset($_COOKIE['login-id']) && $return == 0) {
        $return = 2;
      }
      else {
        if($return != 1) {
          setcookie('login-id', $username.'-'.hash('sha256', $username.$id),time()+60*60*24*30*12*10);
          $return == 3;
        }
      }
      return $return;
    }
    public __construct($mysqli)
    {
      $this->mysqli = $mysqli;
    }
  }

avatar ענה zacharya ב 28 לאפריל 2014 #

רשמת this במקום $this, וזה גם צריך להיות function __construct ולא רק __construct (אני די בטוח בזה. למרות שבתשובה שלו אלכס כתב אחרת ככה שאני לא בטוח לגמרי).
בעיקרון אני לא רואה בעיה בקוד.
או חוץ מזה שלא יצרת מאפיין בכלל של mysqli - ככה (מחוץ למתודה):

private $mysqli;

avatar ענה yotamN ב 28 לאפריל 2014 #

@zacharya כן אתה צודק, עובד עכשיו וגם בלי גלובלים